package com.niit.base

object Base_06 {

  /*
  * class/object A类 extends B类
  * A类：子类
  * B类：父类 超类 基类
  * */

  class Person{
    var name:String = _
    var age:Int = _
    def eat()= println("人要吃饭！！~~！")
  }
  //老师类
  class Teacher extends Person
  //学生类
  class Student extends Person

  //抽象：abstract  定义抽象类 也是抽象字段 抽象方法 。。。拥有抽象方法或抽象字段的类一定是抽象类
  //形状的抽象类
  abstract class Shape{ //抽象类不能直接实例化 需要匿名实例化
    def area:Double
  }

  class Square(var edge:Double) extends Shape{
    //一个继承抽象类 要么实现他的方法 ，要么也是一个抽象类
    override def area: Double = edge *edge
  }
  class Rectangle(var length:Double,var width:Double) extends Shape {
    override def area: Double = length * width
  }

  /*
  Scala 中的特质要用关键字 trait 修饰。
  特点：
  特质可以提高代码的复用性。
  特质可以提高代码的扩展性和可维护性。
  类与特质是继承关系，类与类只支持单继承，类与特质之间可以单继承也可以多继承。
  Scala 的特质中可以有普通字段、抽象字段、普通方法、抽象方法。
  如果特质只有抽象内容也叫瘦接口，如果既有抽象内容又有具体内容叫做富接口。
  interface == trait
   */

  trait Logger{
    def log(msg:String) // 没有方法体的方法称之为抽象方法
  }
  trait File {
    def write(msg:String)
  }
  class ConsoleLogger extends Logger with File {
    override def log(msg: String): Unit = println(msg)

    override def write(msg: String): Unit = println(msg)
  }

  //样例类，是一种特殊的类，一般用于保存数据，在后面数据分析中的并发编程上会用的很多
  /*
    case class 类名([var/val]变量1:类型1…………)｛｝
    变量修饰符不写 默认是val
    定义一个样例类 People 其中 姓名不可改 年龄可以改变
   */
  case class People(name:String,var age:Int=23){}


  def main(args: Array[String]): Unit = {
    //如果样例类中的常量参数不写的话 可以在实例化的时候传入
    val people= new People("李四");
    people.age = 30
    println(people)

    val con = new ConsoleLogger()
    con.log("我是log打印")
    con.write("我是文件写入")


//    val teacher = new Teacher();
//    teacher.name = "张三"
//    teacher.age = 28
//    teacher.eat()
//
//    val student = new Student();
//    student.name = "李四"
//    student.age = 20
//    student.eat()
//    //多态
//    val p:Person = new Student()//Student和Person分别是两个类
//
//    val square:Shape = new Square(10)
//    var rectangle = new Rectangle(5,10)
//    println(square.area)
//    println(rectangle.area)


  }
}
